﻿using System;
using System.Collections.Generic;
using Cartography.Desktop;
using System.Text;
using System.Xml;
using System.Data;
using System.IO;
using System.Collections;
using System.Linq;


namespace MCDS
{

    public class puntosRecomendaciones
    {
        public LatLon coordenadas { get; set; }
        public double distancia { get; set; }
        public String tipo { get; set; }
        public String observaciones { get; set; }
    }

   
    public class MCDS
    {
        struct puntajes
        {
            public String tipo;
            public double puntaje;
        };
        private List<puntosRecomendaciones> recomendacionesTentativas;
        private string tilesPath;
        private DateTime tiempoEmergencia;
        private double distanciaGrifos;
        private double distanciaCarros;
        private double distanciaAguasAbiertas;
        private double distanciaEdificios;
        private int cantidadRecomendaciones;
        private string Latitud = "";
        private string Longitud = "";
        public MCDS(string tilesPath) 
        {
            try
            {
                System.Globalization.NumberFormatInfo nfi = new System.Globalization.CultureInfo("en-US", false).NumberFormat;
                XmlDocument docEmergencia = new XmlDocument();
                XmlDocument docConfigMCDS = new XmlDocument();
                recomendacionesTentativas = new List<puntosRecomendaciones>();
                docConfigMCDS.Load(tilesPath + "\\configMCDS.xml");
                distanciaGrifos = double.Parse(docConfigMCDS.SelectSingleNode("MCDS/DistanciaGrifos").InnerText, nfi);
                distanciaAguasAbiertas = double.Parse(docConfigMCDS.SelectSingleNode("MCDS/DistanciaAguasAbiertas").InnerText, nfi);
                cantidadRecomendaciones = int.Parse(docConfigMCDS.SelectSingleNode("MCDS/CantidadRecomendaciones").InnerText);
                this.tilesPath = tilesPath;
                string fecha, hora;
                fecha = "";
                hora = "";
                if (System.IO.File.Exists(this.tilesPath + "\\PointsOfInterest\\Emergencia.xml"))
                {
                    docEmergencia.Load(this.tilesPath + "\\PointsOfInterest\\Emergencia.xml");
                    fecha = docEmergencia.SelectSingleNode("PointsOfInterest/Points/Point/Emergencia/Fecha").InnerText;
                    hora = docEmergencia.SelectSingleNode("PointsOfInterest/Points/Point/Emergencia/Hora").InnerText;
                    Latitud = docEmergencia.SelectSingleNode("PointsOfInterest/Points/Point/Coordinates/Latitude").InnerText;
                    Longitud = docEmergencia.SelectSingleNode("PointsOfInterest/Points/Point/Coordinates/Longitude").InnerText;
                    distanciaCarros = -1;
                    distanciaEdificios = distanciaCarros;
                }
                if (System.IO.File.Exists(this.tilesPath + "\\PointsOfInterest\\EdificioEmergencia.xml"))
                {
                    docEmergencia.Load(this.tilesPath + "\\PointsOfInterest\\EdificioEmergencia.xml");
                    fecha = docEmergencia.SelectSingleNode("PointsOfInterest/Edificios/Edificio/Emergencia/Fecha").InnerText;
                    hora = docEmergencia.SelectSingleNode("PointsOfInterest/Edificios/Edificio/Emergencia/Hora").InnerText;
                    Latitud = docEmergencia.SelectSingleNode("PointsOfInterest/Edificios/Edificio/Centroide/Latitud").InnerText;
                    Longitud = docEmergencia.SelectSingleNode("PointsOfInterest/Edificios/Edificio/Centroide/Longitud").InnerText;
                    distanciaCarros = double.Parse(docEmergencia.SelectSingleNode("PointsOfInterest/Edificios/Edificio/Altura").InnerText, new System.Globalization.CultureInfo("en-US", false).NumberFormat);
                    distanciaEdificios = distanciaCarros;
                }
                if (!fecha.Equals("") && !hora.Equals(""))
                    tiempoEmergencia = new DateTime(int.Parse(fecha.Substring(0, 4)), int.Parse(fecha.Substring(5, 2)), int.Parse(fecha.Substring(8, 2)),
                                            int.Parse(hora.Substring(0, 2)), int.Parse(hora.Substring(3, 2)), int.Parse(hora.Substring(6, 2)));
            }
            catch (Exception e) 
            { 
               
            }
            }
        public List<ucMCDS> Recomendaciones(string clave) {

            DataTable matriz = CrearMatrizFiltrada(clave);
            if (matriz == null) return null;
            matriz = this.llenarCerosMatriz(matriz);
            DataRow total = matriz.NewRow();
            matriz.Rows.Add(total);
            matriz.Rows[matriz.Rows.Count - 1]["Variable"] = "Totales";
            matriz = this.calcularTotalesMatriz(matriz);
            List<puntajes> puntajesRecomendaciones = new List<puntajes>();
            puntajesRecomendaciones = this.ordenarPuntajes(matriz);
            recomendacionesTentativas.Sort(delegate(puntosRecomendaciones p1, puntosRecomendaciones p2) { return p1.distancia.CompareTo(p2.distancia); });


            List<ucMCDS> recomendaciones = new List<ucMCDS>();
            for (int j = 0; j < puntajesRecomendaciones.Count; j++)
            {
                for (int i = 0; i < recomendacionesTentativas.Count; i++)
                {
                    if (recomendacionesTentativas[i].tipo.Equals(puntajesRecomendaciones[j].tipo) && puntajesRecomendaciones[j].puntaje > 0)
                    {
                        ucMCDS control1 = new ucMCDS();
                        control1.Recomendacion = recomendacionesTentativas[i].tipo + " en " + recomendacionesTentativas[i].observaciones;
                        control1.Coordenadas = recomendacionesTentativas[i].coordenadas;
                        recomendaciones.Add(control1);
                    }
                }
            }
            return recomendaciones;
        }
        private List<puntajes> ordenarPuntajes(DataTable tabla) 
        {
            List<puntajes> puntajesRecomendaciones = new List<puntajes>();
            for (int i = 1; i < tabla.Columns.Count; i++) 
            {
                puntajes puntaje;
                puntaje.puntaje = double.Parse(tabla.Rows[tabla.Rows.Count - 1][i].ToString(), new System.Globalization.CultureInfo("en-US", false).NumberFormat);
                puntaje.tipo = tabla.Columns[i].ColumnName;
                if(puntaje.puntaje>0)
                puntajesRecomendaciones.Add(puntaje);
            }
            puntajesRecomendaciones.Sort(delegate(puntajes p1, puntajes p2) { return p1.puntaje.CompareTo(p2.puntaje); });
            puntajesRecomendaciones.Reverse();

            return puntajesRecomendaciones;
        }
        private DataTable calcularTotalesMatriz(DataTable tabla) 
        {
            double total, valor;
            int veces;

            for (int i = 1; i < tabla.Columns.Count; i++)
            {
                total=0;
                veces = 0;
                for (int j = 2; j < tabla.Rows.Count-1; j++)
                {
                    valor=double.Parse(tabla.Rows[j][i].ToString(), new System.Globalization.CultureInfo("en-US", false).NumberFormat);
                    total += valor;
                    if (valor > 0) { veces++; }
                }
                if (veces == 0) { veces = 1; }
                tabla.Rows[tabla.Rows.Count - 1][i] = total/veces;
            }
            return tabla;
        }
        private DataTable llenarCerosMatriz(DataTable tabla) 
        {
            for (int i = 1; i < tabla.Columns.Count; i++) 
            {
                for (int j = 2; j < tabla.Rows.Count; j++) 
                {
                    if (tabla.Rows[j][i].ToString().Equals("")) tabla.Rows[j][i] = 0;
                }
            }

            return tabla;
        }
        public DataTable CrearMatrizTemporalidad(string clave) 
        {
            try
            {
                XmlDocument doc = new XmlDocument();
                doc.Load(tilesPath + "\\MCDS.xml");
                DataTable matriz = null;
                XmlNodeList listaEmergenciaMCDS = doc.SelectNodes("/MCDS/Emergencia");
                Boolean existe = false;
                XmlNode nodoEmergenciaMCDS = null;
                foreach (XmlNode auxNodoEmergenciaMCDS in listaEmergenciaMCDS)
                {
                    if (auxNodoEmergenciaMCDS.SelectSingleNode("Clave").InnerText.Equals(clave))
                    {
                        nodoEmergenciaMCDS = auxNodoEmergenciaMCDS;
                        existe = true;
                        break;
                    }
                }
                if (existe)
                {
                    matriz = new DataTable();
                    matriz.Columns.Add("Recomendación");
                    matriz.Columns.Add("TempPeriosidad");
                    matriz.Columns.Add("Temporalidad");


                    XmlNodeList listaRecomendaciones = nodoEmergenciaMCDS.SelectNodes("Recomendaciones/Recomendacion");
                    foreach (XmlNode recomendacion in listaRecomendaciones)
                    {
                        DataRow fila = matriz.NewRow();
                        fila["Recomendación"] = recomendacion.SelectSingleNode("Accion").InnerText;
                        fila["TempPeriosidad"] = recomendacion.SelectSingleNode("Temporalidad").InnerText;
                        fila["Temporalidad"] = recomendacion.SelectSingleNode("Tiempo").InnerText;
                        matriz.Rows.Add(fila);
                    }
                }
                return matriz;
            }
            catch (Exception e) 
            {
                return null;
            }
        }
        public DataTable CrearMatriz(string clave) 
        {
            try
            {
                XmlDocument doc = new XmlDocument();
                doc.Load(tilesPath + "\\MCDS.xml");
                DataTable matriz = null;
                XmlNodeList listaEmergenciaMCDS = doc.SelectNodes("/MCDS/Emergencia");
                Boolean existe = false;
                XmlNode nodoEmergenciaMCDS = null;
                foreach (XmlNode auxNodoEmergenciaMCDS in listaEmergenciaMCDS)
                {
                    if (auxNodoEmergenciaMCDS.SelectSingleNode("Clave").InnerText.Equals(clave))
                    {
                        nodoEmergenciaMCDS = auxNodoEmergenciaMCDS;
                        existe = true;
                        break;
                    }
                }
                if (existe)
                {
                    matriz = new DataTable();
                    matriz.Columns.Add("Variable");
                    //DataRow filaPeriosidad = matriz.NewRow();
                    //DataRow filaTemporalidad = matriz.NewRow();

                    //filaPeriosidad["Variable"] = "Periosidad";
                    //filaTemporalidad["Variable"] = "Temporalidad";

                    //matriz.Rows.Add(filaPeriosidad);
                    //matriz.Rows.Add(filaTemporalidad);


                    XmlNodeList listaRecomendaciones = nodoEmergenciaMCDS.SelectNodes("Recomendaciones/Recomendacion");
                    foreach (XmlNode recomendacion in listaRecomendaciones)
                    {
                        string columna = recomendacion.SelectSingleNode("Accion").InnerText;
                        if (matriz.Columns.IndexOf(columna) == -1)
                        {
                            matriz.Columns.Add(columna);
                        }
                        XmlNodeList listaVariables = recomendacion.SelectNodes("Variables/Variable");
                        foreach (XmlNode variable in listaVariables)
                        {
                            int numeroFila = this.fila(matriz, variable.SelectSingleNode("Texto").InnerText);
                            if (numeroFila == -1)
                            {
                                DataRow filaAux = matriz.NewRow();
                                matriz.Rows.Add(filaAux);
                                numeroFila = matriz.Rows.Count - 1;
                            }
                            matriz.Rows[numeroFila]["Variable"] = variable.SelectSingleNode("Texto").InnerText;
                            matriz.Rows[numeroFila][columna] = variable.SelectSingleNode("Prioridad").InnerText;
                            //matriz.Rows[0][columna] = recomendacion.SelectSingleNode("Temporalidad").InnerText;
                            //matriz.Rows[1][columna] = recomendacion.SelectSingleNode("Tiempo").InnerText;
                        }

                    }
                }
                return matriz;
            }
            catch (Exception e) 
            {
                return null;
            }
        }
        public DataTable CrearMatrizFiltrada(string clave)
        {
            DataTable matriz = null;
            if (tilesPath != null)
            {
                XmlDocument doc = new XmlDocument();
                doc.Load(tilesPath + "\\MCDS.xml");
                
                XmlNodeList listaEmergenciaMCDS = doc.SelectNodes("/MCDS/Emergencia");
                Boolean existe = false;
                XmlNode nodoEmergenciaMCDS = null;
                foreach (XmlNode auxNodoEmergenciaMCDS in listaEmergenciaMCDS)
                {
                    if (auxNodoEmergenciaMCDS.SelectSingleNode("Clave").InnerText.Equals(clave))
                    {
                        nodoEmergenciaMCDS = auxNodoEmergenciaMCDS;
                        existe = true;
                        break;
                    }
                }
                if (existe)
                {
                    matriz = new DataTable();
                    matriz.Columns.Add("Variable");
                    DataRow filaPeriosidad = matriz.NewRow();
                    DataRow filaTemporalidad = matriz.NewRow();

                    filaPeriosidad["Variable"] = "Periosidad";
                    filaTemporalidad["Variable"] = "Temporalidad";

                    matriz.Rows.Add(filaPeriosidad);
                    matriz.Rows.Add(filaTemporalidad);


                    XmlNodeList listaRecomendaciones = nodoEmergenciaMCDS.SelectNodes("Recomendaciones/Recomendacion");
                    foreach (XmlNode recomendacion in listaRecomendaciones)
                    {
                        TimeSpan tiempo = new TimeSpan(tiempoEmergencia.Ticks);
                        string auxTiempo = recomendacion.SelectSingleNode("Tiempo").InnerText;
                        DateTime ahora = new DateTime();
                        DateTime auxDateTimeEmergencia = new DateTime();
                        if (!auxTiempo.Equals(""))
                        {
                            TimeSpan deltaTiempo = new TimeSpan(0, int.Parse(auxTiempo), 0);
                            tiempo = tiempo.Add(deltaTiempo);
                            auxDateTimeEmergencia = new DateTime(tiempo.Ticks);
                            ahora = System.DateTime.Now;
                        }
                        bool cumple = false;
                        string temporalidad = recomendacion.SelectSingleNode("Temporalidad").InnerText;
                        switch (temporalidad)
                        {
                            case "Menor":
                                if (auxDateTimeEmergencia > ahora) cumple = true;
                                break;
                            case "Mayor":
                                if (auxDateTimeEmergencia < ahora) cumple = true;
                                break;
                            case "Siempre":
                                cumple = true;
                                break;
                        }
                        if (cumple)
                        {
                            string columna = recomendacion.SelectSingleNode("Accion").InnerText;
                            if (matriz.Columns.IndexOf(columna) == -1)
                            {
                                matriz.Columns.Add(columna);
                            }
                            XmlNodeList listaVariables = recomendacion.SelectNodes("Variables/Variable");
                            foreach (XmlNode variable in listaVariables)
                            {
                                int numeroFila = this.fila(matriz, variable.SelectSingleNode("Texto").InnerText);
                                if (numeroFila == -1)
                                {
                                    DataRow filaAux = matriz.NewRow();
                                    matriz.Rows.Add(filaAux);
                                    numeroFila = matriz.Rows.Count - 1;
                                }
                                int multiplicador = 0;
                                switch (columna)
                                {
                                    case "Existen grifos cercanos":
                                        multiplicador = VerificarGrifos(columna);
                                        break;
                                    case "Existen aguas abiertas cercanas":
                                        multiplicador = VerificarAguasAbiertas(columna);
                                        break;
                                    case "Material mayor en zona de peligro":
                                        multiplicador = VerificarMaterialMayor(columna);
                                        break;
                                    case "Edificio cercano":
                                        multiplicador = VerificarEdificioCercano(columna);
                                        break;
                                    default:
                                        multiplicador = 0;
                                        break;

                                };
                                matriz.Rows[numeroFila]["Variable"] = variable.SelectSingleNode("Texto").InnerText;
                                matriz.Rows[numeroFila][columna] = (double.Parse(variable.SelectSingleNode("Prioridad").InnerText, new System.Globalization.CultureInfo("en-US", false).NumberFormat) * multiplicador).ToString();
                                matriz.Rows[0][columna] = recomendacion.SelectSingleNode("Temporalidad").InnerText;
                                matriz.Rows[1][columna] = recomendacion.SelectSingleNode("Tiempo").InnerText;
                            }
                        }

                    }
                }
            }
            return matriz;
        }
        private int VerificarMaterialMayor(string tipo) 
        {
            int devolver = 0;
            if (!tilesPath.Equals(""))
            {
                if (System.IO.File.Exists(this.tilesPath + "\\PointsOfInterest\\CarrosEmergencia.xml")&& (distanciaCarros>0))
                {
                    XmlDocument docCarros = new XmlDocument();
                    docCarros.Load(this.tilesPath + "\\PointsOfInterest\\CarrosEmergencia.xml");
                    System.Globalization.NumberFormatInfo nfi = new System.Globalization.CultureInfo("en-US", false).NumberFormat;
                    if (Latitud.Equals("") || Longitud.Equals("")) return devolver;
                    LatLon auxPunto = new LatLon(double.Parse(Latitud, nfi), double.Parse(Longitud, nfi));
                    XmlNodeList carros  = docCarros.SelectNodes("/PointsOfInterest/Points/Point");
                    for (int j = 0; j < carros.Count; j++)
                    {
                        LatLon posCarro = new LatLon(carros[j].SelectSingleNode("Coordinates/Latitude").InnerText, carros[j].SelectSingleNode("Coordinates/Longitude").InnerText);
                        double auxDistancia = distanciaMts(auxPunto, posCarro);
                        if (auxDistancia <= distanciaCarros)
                        {
                            puntosRecomendaciones nodo = new puntosRecomendaciones();
                            nodo.coordenadas = posCarro;
                            nodo.tipo = tipo;
                            nodo.distancia = auxDistancia;
                            nodo.observaciones = carros[j].SelectSingleNode("Name").InnerText;
                            recomendacionesTentativas.Add(nodo);
                            devolver = 1;
                        }
                    }

                }
                else 
                {
                    return devolver;
                }
            }

            return devolver;
        }
        private int VerificarEdificioCercano(string tipo)
        {
            int devolver = 0;
            if (!tilesPath.Equals(""))
            {
                if (System.IO.File.Exists(this.tilesPath + "\\PointsOfInterest\\Edificios.xml") && (distanciaEdificios > 0))
                {
                    XmlDocument docEdificios = new XmlDocument();
                    docEdificios.Load(this.tilesPath + "\\PointsOfInterest\\Edificios.xml");
                    System.Globalization.NumberFormatInfo nfi = new System.Globalization.CultureInfo("en-US", false).NumberFormat;
                    if (Latitud.Equals("") || Longitud.Equals("")) return devolver;
                    LatLon auxPunto = new LatLon(double.Parse(Latitud, nfi), double.Parse(Longitud, nfi));
                    XmlNodeList edificios = docEdificios.SelectNodes("/PointsOfInterest/Edificios/Edificio");
                    for (int j = 0; j < edificios.Count; j++)
                    {
                        XmlNodeList vertices = edificios[j].SelectNodes("Vertices/Vertice");
                        XmlNode centroide = edificios[j].SelectSingleNode("Centroide");
                        if (!centroide.SelectSingleNode("Latitud").InnerText.Equals(Latitud) && !centroide.SelectSingleNode("Longitud").InnerText.Equals(Longitud))
                        {
                            for (int i = 0; i < vertices.Count; i++)
                            {
                                LatLon vertice = new LatLon(vertices[i].SelectSingleNode("Latitud").InnerText, vertices[i].SelectSingleNode("Longitud").InnerText);
                                double auxDistancia = distanciaMts(auxPunto, vertice);
                                if (auxDistancia <= distanciaEdificios)
                                {
                                    puntosRecomendaciones nodo = new puntosRecomendaciones();
                                    nodo.coordenadas = new LatLon(double.Parse(edificios[j].SelectSingleNode("Centroide/Latitud").InnerText, nfi), double.Parse(edificios[j].SelectSingleNode("Centroide/Longitud").InnerText, nfi));
                                    nodo.tipo = tipo;
                                    nodo.distancia = auxDistancia;
                                    nodo.observaciones = edificios[j].SelectSingleNode("Direccion").InnerText + ", edificio '" + edificios[j].SelectSingleNode("Nombre").InnerText+"'";
                                    recomendacionesTentativas.Add(nodo);
                                    devolver = 1;
                                    break;
                                }
                            }
                        }
                    }
                }
                else
                {
                    return devolver;
                }
            }

            return devolver;
        }
        private int VerificarGrifos(string tipo) 
        {
            int devolver = 0;
            if (!tilesPath.Equals(""))
            {
                string[] archivos = Directory.GetFiles(tilesPath + "\\PointsOfInterest", "Grifos*");
                System.Globalization.NumberFormatInfo nfi = new System.Globalization.CultureInfo("en-US", false).NumberFormat;
                if (Latitud.Equals("") || Longitud.Equals("")) return devolver;
                LatLon auxPunto = new LatLon(double.Parse(Latitud, nfi),double.Parse(Longitud, nfi));// { double.Parse(Longitud, nfi), double.Parse(Latitud, nfi) };
                for (int i=0;i< archivos.Count(); i++)
                {
                    string directorio = archivos[i];
                    XmlDocument docGrifos = new XmlDocument();
                    docGrifos.Load(directorio);
                    
                    XmlNodeList grifos = docGrifos.SelectNodes("/PointsOfInterest/Points/Point");
                    for (int j = 0; j < grifos.Count; j++ )
                    {

                        LatLon posGrifo = new LatLon(grifos[j].SelectSingleNode("Coordinates/Latitude").InnerText, grifos[j].SelectSingleNode("Coordinates/Longitude").InnerText);
                        double auxDistancia = distanciaMts(auxPunto, posGrifo);
                        if (auxDistancia <= distanciaGrifos)
                        {
                            puntosRecomendaciones nodo = new puntosRecomendaciones();
                            nodo.coordenadas = posGrifo;
                            nodo.tipo = tipo;
                            nodo.distancia = auxDistancia;
                            nodo.observaciones = grifos[j].SelectSingleNode("Address").InnerText;
                            recomendacionesTentativas.Add(nodo);
                            devolver = 1;
                        }
                    }
                }
            }
            return devolver;
        
        }
        private int VerificarAguasAbiertas(string tipo)
        {
            int devolver = 0;
            if (!tilesPath.Equals(""))
            {
                if (System.IO.File.Exists(this.tilesPath + "\\PointsOfInterest\\AguasAbiertas.xml") && (distanciaAguasAbiertas > 0))
                {
                    XmlDocument docAguasAbiertas = new XmlDocument();
                    docAguasAbiertas.Load(this.tilesPath + "\\PointsOfInterest\\AguasAbiertas.xml");
                    System.Globalization.NumberFormatInfo nfi = new System.Globalization.CultureInfo("en-US", false).NumberFormat;
                    if (Latitud.Equals("") || Longitud.Equals("")) return devolver;
                    LatLon auxPunto = new LatLon(double.Parse(Latitud, nfi), double.Parse(Longitud, nfi));
                    XmlNodeList aguasAbiertas = docAguasAbiertas.SelectNodes("/PointsOfInterest/Points/Point");
                    for (int j = 0; j < aguasAbiertas.Count; j++)
                    {
                        LatLon posAguaAbierta = new LatLon(aguasAbiertas[j].SelectSingleNode("Coordinates/Latitude").InnerText, aguasAbiertas[j].SelectSingleNode("Coordinates/Longitude").InnerText);
                        double auxDistancia = distanciaMts(auxPunto, posAguaAbierta);
                        if (auxDistancia <= distanciaAguasAbiertas)
                        {
                            puntosRecomendaciones nodo = new puntosRecomendaciones();
                            nodo.coordenadas = posAguaAbierta;
                            nodo.tipo = tipo;
                            nodo.distancia = auxDistancia;
                            nodo.observaciones = aguasAbiertas[j].SelectSingleNode("Address").InnerText +" con capacidad de " +
                                                    aguasAbiertas[j].SelectSingleNode("Volume").InnerText+" litros.";
                            recomendacionesTentativas.Add(nodo);
                            devolver = 1;
                        }
                    }

                }
                else
                {
                    return devolver;
                }
            }

            return devolver;
        }
        private int fila(DataTable tabla, string variable) 
        {
            int fila = -1;
            string nombreFila = "";
            for (int i = 0; i < tabla.Rows.Count; i++) 
            {
                nombreFila= tabla.Rows[i]["Variable"].ToString();
                if (nombreFila.Equals(variable)) 
                {
                    fila = i;
                    break;
                }
            }
            return fila;
        }
        private int fila2(DataTable tabla, string variable)
        {
            int fila = -1;
            string nombreFila = "";
            for (int i = 0; i < tabla.Rows.Count; i++)
            {
                nombreFila = tabla.Rows[i]["Recomendación"].ToString();
                if (nombreFila.Equals(variable))
                {
                    fila = i;
                    break;
                }
            }
            return fila;
        }
        private double distanciaMts(LatLon p1, LatLon p2)
        {
            double R = 6371000; // mts 
            double dLat = (p2.Latitude - p1.Latitude) * Math.PI / 180;
            double dLon = (p2.Longitude - p1.Longitude) * Math.PI / 180;
            double a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2) +
                Math.Cos(p1.Latitude * Math.PI / 180) * Math.Cos(p1.Latitude * Math.PI / 180) *
                Math.Sin(dLon / 2) * Math.Sin(dLon / 2);
            double c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
            double d = R * c;
            return d;
        }
        public void guardarPreferencias(DataTable preferencia, DataTable temporalidad, string clave) 
        {
            XmlDocument docMCDS = new XmlDocument();
            try
            {
                docMCDS.Load(tilesPath + "\\MCDS.xml");
                XmlNodeList recomendaciones = docMCDS.SelectNodes("MCDS/Emergencia/Recomendaciones/Recomendacion");
                for (int i = 0; i < recomendaciones.Count; i++) 
                {
                    string columna = recomendaciones[i].SelectSingleNode("Accion").InnerText;
                    XmlNodeList variables = recomendaciones[i].SelectNodes("Variables/Variable");
                    for (int j = 0; j < variables.Count; j++)
                    {
                        variables[j].SelectSingleNode("Prioridad").InnerText = preferencia.Rows[fila(preferencia, variables[j].SelectSingleNode("Texto").InnerText)][columna].ToString();
                    }
                    recomendaciones[i].SelectSingleNode("Temporalidad").InnerText = temporalidad.Rows[fila2(temporalidad, columna)]["TempPeriosidad"].ToString();
                    recomendaciones[i].SelectSingleNode("Tiempo").InnerText = temporalidad.Rows[fila2(temporalidad, columna)]["Temporalidad"].ToString();
                }
                docMCDS.Save(tilesPath + "\\MCDS.xml");
            }
            catch(Exception e) { }
        }

    }
}
